package com.antd.common.core.util;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.antd.admin.api.entity.SysMenu;
import com.antd.admin.api.vo.MenuTreeVo;
import com.antd.common.core.constant.Constant;
import com.antd.common.core.constant.MenuConstant;
import com.google.common.collect.Lists;
import lombok.experimental.UtilityClass;
import org.springframework.beans.BeanUtils;

import java.util.List;

/**
 * TODO
 *
 * @author 子丶沫
 * @version 1.0
 * @date 2020/11/20 14:00
 */
@UtilityClass
public class AntdMenuUtil {

    public boolean exists(List<MenuTreeVo> menuTreeVoList,MenuTreeVo menuTreeVo){
        boolean exist=false;
        for(MenuTreeVo treeVo:menuTreeVoList){
            if(treeVo.getMenuId().equals(menuTreeVo.getMenuId())){
                exist=true;
                break;
            }
        }
        return !exist;
    }

    public void getPermissionJsonArray(JSONArray jsonArray, List<SysMenu> menuList, JSONObject parentJson){
        for(SysMenu permission : menuList){
           if(ObjectUtil.isNull(permission.getType())){
               continue;
           }
            String tempPid = permission.getParentId();
            JSONObject json = getPermissionJsonObject(permission);
            if (json == null) {
                continue;
            }
            if (parentJson == null && Constant.PARENT_ID.equals(tempPid)) {
                jsonArray.add(json);
                getPermissionJsonArray(jsonArray, menuList, json);
            } else if (parentJson != null &&!Constant.PARENT_ID.equals(tempPid)&& tempPid.equals(parentJson.getString("id"))) {
                // 类型( 0：一级菜单 1：子菜单 2：按钮 )
                if (permission.getType().equals(1) || permission.getType().equals(0)) {
                    if (parentJson.containsKey("children")) {
                        parentJson.getJSONArray("children").add(json);
                    } else {
                        JSONArray children = new JSONArray();
                        children.add(json);
                        parentJson.put("children", children);
                    }
                    getPermissionJsonArray(jsonArray, menuList, json);
                }
            }
        }
    }
    public JSONObject getPermissionJsonObject(SysMenu permission) {
        JSONObject json = new JSONObject();
        // 类型(0：一级菜单 1：子菜单 2：按钮)
        if (permission.getType().equals(MenuConstant.MenuType.BUTTON.getValue())) {
            return null;
        } else if (permission.getType().equals(0) || permission.getType().equals(1)) {
            json.put("id", permission.getMenuId());
            if (isUrl(permission.getPath())) {
                json.put("path", permission.getPath());
            } else {
                json.put("path", permission.getPath());
            }

            // 重要规则：路由name (通过URL生成路由name,路由name供前端开发，页面跳转使用)
            if (StrUtil.isNotEmpty(permission.getComponent())) {
                json.put("name", urlToRouteName(permission.getName()));
            }

            // 是否隐藏路由，默认都是显示的
//            if (permission.getHidden()) {
//                json.put("hidden", true);
//            }
            // 聚合路由
            if (permission.getAlwaysShow()) {
                json.put("alwaysShow", true);
            }

            if (permission.getParentId().equals(Constant.PARENT_ID)) {
                //一级目录需要加斜杠，不然访问 会跳转404页面
                json.put("component", StrUtil.isEmpty(permission.getComponent()) ? "Layout" : permission.getComponent());
            } else if (!StrUtil.isEmpty(permission.getComponent())) {
                json.put("component", permission.getComponent());
            }

            if (StrUtil.isNotEmpty(permission.getIcon())) {
                json.put("icon", permission.getIcon());
            }
            JSONObject meta = new JSONObject();
            // 由用户设置是否缓存页面 用布尔值
            if (permission.getKeepAlive()) {
                meta.put("keepAlive", true);
            } else {
                meta.put("keepAlive", false);
            }

            meta.put("title", permission.getName());
            if (permission.getParentId().equals(Constant.PARENT_ID)) {
                // 一级菜单跳转地址
                json.put("redirect", permission.getRedirect());
            }
            if (StrUtil.isNotEmpty(permission.getIcon())) {
                meta.put("icon", permission.getIcon());
            }
            if (isUrl(permission.getPath())) {
                meta.put("url", permission.getPath());
            }
            meta.put("title",permission.getTitle());
            json.put("meta", meta);
        }

        return json;
    }
    /**
     * 判断是否外网URL
     *
     * @return
     */
    private boolean isUrl(String url) {
        return url != null && (url.startsWith("http://") || url.startsWith("https://") || url.startsWith("{{"));
    }

    /**
     * 路由名称
     * @param url
     * @return
     */
    private String urlToRouteName(String url) {
        if (StrUtil.isNotEmpty(url)) {
            int i = url.lastIndexOf("/");
            return url.substring(i + 1);
        } else {
            return null;
        }
    }
    public void findMenuChildren(List<MenuTreeVo> menuTreeVoList,List<SysMenu> menuList){
        for(MenuTreeVo sysMenu:menuTreeVoList){
            List<MenuTreeVo> children=Lists.newArrayList();
            for(SysMenu menu:menuList){
                if(StrUtil.isNotBlank(menu.getParentId())&&sysMenu.getMenuId().equals(menu.getParentId())){
                    MenuTreeVo menuTreeVo=new MenuTreeVo();
                    BeanUtils.copyProperties(menu,menuTreeVo);
                    menuTreeVo.setTitle(menu.getName());
                    menuTreeVo.setValue(menu.getMenuId());
                    menuTreeVo.setParentName(sysMenu.getName());
                    if(exists(children,menuTreeVo)){
                        children.add(menuTreeVo);
                    }
                }
            }
            sysMenu.setChildren(children);
            findMenuChildren(children,menuList);
        }
    }
}
